package com.gqs.bookstore.vo;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
//加到购物车[ShopCart]里必须要符合一定的接口规范，所以就定义了一个Goods接口
@SuppressWarnings("serial")
public class ShopCart implements Serializable {
	private Map<Long, Goods> data = new HashMap<Long, Goods>();
	private Integer itemCounts;//这里得到Map里总共有多少个key，大小类型用Integer表示【而key本身的数据类型是如上为Long类型】
	private Collection<Goods> collectionGoods;//获取map里的所有的Goods值，而所有的Goods值构成了一个包含所有Goods的Collection集合
	/**
	 * Map没有继承Collection接口，Map提供key到value的映射。一个Map中不能包含相同的key，
	 * 每个key只能映射一个 value。【但是value有可能是相同的】Map接口提供3种集合的视图，Map的内容可以被当作一组key集合，一组value集合，
	 * 或者一组key-value映射。
	 * Map<key, value>	key不允许重复，value允许重复【即允许多对一】
	 * 
	 * List<类型>允许有相同的元素，有序
	 * 
	 * set<类型>不允许有相同的元素，无序
	 * 
	 */
	
	/**
	 * 添加data
	 * @param t
	 */
	//因为增加的是一个map类型的data,所以参数传进去的是Goods类型的对象
	public void addItem(Goods t){
		//第一次购某类货物
		if(!data.containsKey(t.getId())){//如果此映射包含指定键的映射关系，则返回 true,否则返回为false
			data.put(t.getId(), t);//添加map的一个data
		}//第二次购买某类相同的货物
		else{
			Goods g = new Book();
			g = data.get(t.getId());//返回指定键所映射的值；即map里面的value值
			//注意这里是第二次购买某类相同的货物，所以要在原来的基础上加1
			//count是不在单查的基础上查的
			g.setCount(g.getCount()+1);
		}
	}
	
	
	
	/**
	 * 删除data
	 * @param id
	 */
	public void removeItem(Long id){
		if(data.containsKey(id)){
			data.remove(id);//移除map的一个id所对应的一个value值
		}
	}
	
	/**
	 * 计算购物车中有多少种项【各种各类货物数量的总共种项，同类的算作一种】[key不允许重复]
	 * map里所有的key相当于是一个set集合，所以不允许重复
	 * @return
	 */
	public Integer getItemCounts() {
		//这里得到Map里总共有多少个key，因为map里的key是不允许重复的[所有的key相当于是一个set集合]，所以这里求得其size()值是正确的
	    itemCounts = data.keySet().size();
		return itemCounts;
		
	}
	
	/**
	 * 获取所有的项【这里的值是允许重复的，重复的值不能算作一个】
	 * map里所有的value是一个collection集合
	 * @return
	 */
	public Collection<Goods> getAllItem(){
		//获取map里的所有的Goods值，从而构成了一个包含所有Goods的Collection集合
		//因为Goods里还含有很多信息，所以得到集合然后后续进一步遍历得到所需的信息；而不是data.values().size(),这没有任何意义
		//因为在map里values值是允许重复的，所以这样求得的size是不准确的
	    collectionGoods = data.values();
		return collectionGoods;
		
	}
	
	/**
	 * 取得某类货物的总价格
	 * @return
	 */
	public Double getTotalPrice(){
		Double sum = 0D;
		for (Goods g : collectionGoods) {
			sum += g.getPrice() * g.getCount();//计算每一种货物的单价乘以每一种货物的数量，然后再求其全部种类货物的总价之和
		}
		return sum;
	}
	
	
	
	
	
	/**
	 * 更新某类获物的最新数量
	 * @param id
	 * @param count
	 */
	//因为仅仅只是更新数量，所以只传一个id找到要更新的那个Goods，再传一个count更新就可以
	public void updateCount(Long id, Integer count){
		if(data.containsKey(id)){
			Goods g = new Book();
			g = data.get(id);
			g.setCount(count);//某类新货物的数量覆盖掉之前的旧数量
			
		}
	}
	
	
}
